#include <dogadjaji.h>
#include <pozivi_jezgre.h>

//debug
#include <ispis.h>

int stvori_red_dogadjaja (int zast, int prio)
{
	struct {
		int zast;
		int prio;
	} p;
	
	p.zast = zast;
	p.prio = prio;
	
	return J_FUNKCIJA(STVORI_RED_DOGADJAJA, &p);
}

int obrisi_red_dogadjaja (int id)
{
	return J_FUNKCIJA(OBRISI_RED_DOGADJAJA, &id);
}

int prijavi_se_na_red_dogadjaja (int id, 
				 void (*funkcija) (dogadjaj_t *dog, void *),
				 void *param)
{
	struct {
		int id;
		void (*funkcija) (dogadjaj_t *dog, void *param);
		void *param;
	} p;
	
	p.id = id;
	p.funkcija = funkcija;
	p.param = param;

	return J_FUNKCIJA(PRIJAVI_SE_NA_RED_DOGADJAJA, &p);
}

int postavi_dogadjaj (int tip, int param, void *pparam, int prio,
		      int kome, int id)
{
	struct {
		int tip;
		int param;
		void *pparam;
		int prio;
		int kome;
		int id;
	} p;

	p.tip = tip;
	p.param = param;
	p.pparam = pparam;
	p.prio = prio;
	p.kome = kome;
	p.id = id;

	return J_FUNKCIJA(POSTAVI_DOGADJAJ, &p);
}

int dohvati_dogadjaj_t (int id_reda, int tip, dogadjaj_t *dog, int zast,
			vrijeme_t *koliko)
{
	struct {
		int id_reda;
		int tip;
		dogadjaj_t *dog;
		int zast;
		vrijeme_t *koliko;
	} p;
	int povvr;
	
	p.id_reda = id_reda;
	p.tip = tip;
	p.dog = dog;
	p.zast = zast;
	p.koliko = koliko;

	povvr = J_FUNKCIJA(DOHVATI_DOGADJAJ, &p);
	
	while ((p.zast & DOG_CEKAJ) && povvr == 1)
		povvr = J_FUNKCIJA(DOHVATI_DOGADJAJ, &p);
	
	return povvr;
}

/* dio izbacen iz koda jezgre, jer se ne izvodi u jezgri */

//funkcija koja se podmetne za obradu dogadjaja
//prava funkcija obrade salje se kao parametar
void obrada_dogadjaja (void *povratak,
		       void (*obrada_dog) (dogadjaj_t *, void *),
		       void *p, dogadjaj_t dogadjaj)
{
	obrada_dog(&dogadjaj, p);

	J_FUNKCIJA(KRAJ_OBRADE_DOGADJAJA, povratak);
}